﻿#include<iostream>
using namespace std;
class Animal
{
public:
	virtual void say() const = 0;
};
class Dog:public Animal
{
public:
	virtual void say() const override final{	cout << "旺旺" << endl;  }
};
class Cat :public Animal
{
public:
	virtual void say() const override final{	cout << "喵喵" << endl;  }
};
void Func(Animal* a)
{
	a->say();
}
//int main()
//{
//	Dog d;
//	Cat c;
//	Func(&d);
//	Func(&c);
//	return 0;
//}
//struct Person
//{
//	virtual void BuyTicket() const { cout << "普通人全价购票" << endl; }//虚函数
//};
//struct Student :public Person
//{
//	virtual void BuyTicket() const { cout << "学生半价购票" << endl; }
//};
//void Func(Person* p)
//{
//	// 这里可以看到虽然都是Person指针Ptr在调用BuyTicket 
//    // 但是跟ptr没关系，而是由ptr指向的对象决定的。
//	p->BuyTicket();
//}
//void Func(Person& p)
//{
//	p.BuyTicket();
//}
//int main()
//{
//	Person p; Student s;
//	Func(p); Func(s);
//	return 0;
//}
//struct Person
//{
//	 void BuyTicket() const { cout << "普通人全价购票" << endl; }
//};
//struct Student :public Person
//{
//	 void BuyTicket() const { cout << "学生半价购票" << endl; }
//};
//void Func(Person& p)
//{
//	p.BuyTicket();
//}
//int main()
//{
//	Person p; Student s;
//	Func(p); Func(s);
//	return 0;
//}
//class A
//{
//public:
//	virtual void func(int val = 1) { std::cout << "A->" << val << std::endl; }
//	virtual void test() { func(); }
//};
//class B : public A
//{
//public:
//	void func(int val = 0) { std::cout << "B->" << val << std::endl; }
//};
//
//int main()
//{
//	B* p = new B;
//	p->test();
//	return 0;
//}
//class A {};
//class B : public A {};
//class Person {
//public:
//	virtual A* BuyTicket()//只要求是基类的返回基类的指针或引用，并不要求是在同一继承体系中
//	{
//		cout << "买票-全价" << endl;
//		return nullptr;
//	}
//};
//class Student : public Person {
//public:
//	virtual B* BuyTicket()//同理
//	{
//		cout << "买票-打折" << endl;
//		return nullptr;
//	}
//};
//void Func(Person* ptr)
//{
//	ptr->BuyTicket();
//}
//int main()
//{
//	Person ps;
//	Student st;
//	Func(&ps);
//	Func(&st);
//    return 0;
//}
//class Car {
//public:
//	virtual void Dirve()
//	{}
//};
//class Benz :public Car {
//public:
//	// error C3668: “Benz::Drive”: 包含重写说明符“override”的⽅法没有重写任何基类⽅法 
//	virtual void Drive() override
//	{
//		cout << "Benz-舒适" << endl;
//	}
//};
//int main()
//{
//	return 0;
//}
//class Car
//{
//public:
//	virtual void Drive() final {}
//};
//class Benz :public Car
//{
//public:
//	// error C3248: “Car::Drive”: 声明为“final”的函数无法被“Benz::Drive”重写 
//	virtual void Drive() { cout << "Benz-舒适" << endl; }
//};
//int main()
//{
//	return 0;
//}
//class Car
//{
//public:
//	virtual void Drive() = 0;
//};
//class Benz :public Car
//{
//public:
//	virtual void Drive()
//	{
//		cout << "Benz-舒适" << endl;
//	}
//};
//class BMW :public Car
//{
//public:
//	virtual void Drive()
//	{
//		cout << "BMW-操控" << endl;
//	}
//};
//int main()
//{
//	// 编译报错：error C2259: “Car”: 无法实例化抽象类 
//	Car car;
//	Car* pBenz = new Benz;
//	pBenz->Drive();
//	Car* pBMW = new BMW;
//	pBMW->Drive();
//	return 0;
//}
class Base
{
public:
	virtual void Func1()
	{
		cout << "Func1()" << endl;
	}
protected:
	int _b = 1;
	char _ch = 'x';
};
int main()
{
    Base b;
	cout << sizeof(b) << endl;
	return 0;
}
